package cn.qzzg.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * <h2>Token 生成以及解析</h2>
 */
@Component
public class JJWTTokenUtil {
    /**
     * verifyToken 秘钥
     */
    private static String tokenKey;
    /**
     * verifyToken 过期时间： 分
     */
    private static Integer expirationTime;

    @Value("${jwt.token-key}")
    public void setTokenKey(String tokenKey) {
        JJWTTokenUtil.tokenKey =  tokenKey;
    }

    @Value("${jwt.expiration-time}")
    public void setExpirationTime(Integer expirationTime) {
        JJWTTokenUtil.expirationTime = expirationTime;
    }

    /**
     * 生成 Token <br/>
     *
     * @param userId 登录成功后用户 user_id, 参数 user_id不可传空
     * @return verifyToken
     */
    public static String createToken(String userId) {
        /* 过期时间 */
        Calendar expire = Calendar.getInstance();
        expire.setTime(new Date());
        expire.set(Calendar.MINUTE, expire.get(Calendar.DATE) + expirationTime);

        /* token头部信息 */
        Map<String, Object> header = new HashMap<>();
        header.put("typ", "JWT");
        header.put("nbr", Math.random() * 1000000);

        // 生成token
        return Jwts.builder()
                .setHeader(header)
                .setSubject(userId)                     // userID
                .setIssuer("Nine")                      // 签发者
                .setId(UUID.randomUUID().toString())    // UUID
                .setIssuedAt(new Date())                // 当前时间
                // .setExpiration(expire.getTime())        // 过期时间
                .signWith(SignatureAlgorithm.HS256, tokenKey)
                .compact();
    }

    /**
     * 解析 Token
     *
     * @param token verifyToken
     * @return 解析成功返回 Claims
     */
    public static Claims verifyToken(String token) {
        return Jwts.parser()
                .setSigningKey(tokenKey)
                .parseClaimsJws(token)
                .getBody();
    }
}
